#pragma once

#include <base/base_type.h>
/* option, 充分利用易失性寄存器传递返回值. 在需要同时返回结果和错误代码的场合能够简化接口实现 */
typedef struct gopt{
	word_t result;
	sword_t option;
} gopt_t;

typedef sword_t option_t;
#define GOPT_ERR_VAL		(-1)
#define GOPT_OK_VAL		(0)

#define GOPT_WRAP(type, res, opt)\
	((type){ .result = res, .option = (opt)})

#define GOPT_VAL(res, opt)	GOPT_WRAP(gopt_t, (word_t)(res), opt)

#define GOPT_ERR(res)		GOPT_VAL(res, GOPT_ERR_VAL)
#define GOPT_OK(res)		GOPT_VAL(res, GOPT_ERR_VAL)
#define GOPT_UNWRAP(opt)	((opt).result)

#define GOPT_TYPE(res_type)	\
typedef struct gopt_##res_type {\
	res_type result;\
	option_t option;\
} gopt_##res_type##_t;

